#include "interface.h"
#include "Sever_Login_Itrfc.h"
#include "Sever_Connect_Itrfc.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <ctype.h>


/* 函数功能：点击按钮“添加服务器”的动作
 * 入口参数：
 * 出口参数：无
 * 返 回 值 ：int
 *         SUCCESS  函数成功执行
 *         FAILURE  函数执行出错
 * 创建日期：2009年7月8号
 * 创 建 人 ：匡波 马小艳
 * 更新历史：暂无
 */
gint on_SeverAdd_clicked(GtkWidget *widegt, gpointer data)
{
    GtkWidget *entry_serveradd = NULL;
    GtkWidget *tree_view = NULL;
    GtkListStore *liststore = NULL;    
    GtkTreeIter iter;
    
    const gchar *serveradd = NULL; 
    int i;
	
	/* 获取界面的树控件 */
    tree_view = glade_xml_get_widget(window1, "SvConnectTree");
    if(tree_view == NULL)
    {
        g_print("获取控件 %s 失败!\n", "SvConnectTree");
	    
	    return FAILURE;
    }

    /* 获取tree_view的存储视图 */
    liststore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)));

    entry_serveradd = glade_xml_get_widget(window1, "sventry1"); 
   
    if(entry_serveradd == NULL)
    {
        g_print("获取控件 %s 失败!\n", "sventry1");
	    
	    return FAILURE;
    }

    /* 获取用户输入服务器信息 */
    serveradd = gtk_entry_get_text(GTK_ENTRY(entry_serveradd)); 
   
    gint len = strlen(serveradd);    

    if (len == 0 )
    {
        showDialog(NULL,
                   GTK_DIALOG_DESTROY_WITH_PARENT,
                   GTK_MESSAGE_ERROR,
                   GTK_BUTTONS_CLOSE,
                   "请按下述格式输入:\n\n服务器名＠服务器IP " );
	    return FAILURE;
    }

	/* 拷贝用户输入的服务器名 */
    gchar *pserver = ( char * ) malloc ( sizeof( gchar ) * len + 1);
    strcpy( pserver, serveradd);

    /* 查找＠的位置 */
    gchar *pa = strstr ( pserver, "@");
    gchar *right = pa +1;
   
    /* TODO 检查服务器名，IP格式输入是否正确 */

    /* 检查输入格式 */
    if((!pa )|| (pa == pserver) ||(strlen(right) == 0) || (*right == '@'))
    {
        showDialog(NULL,
                   GTK_DIALOG_DESTROY_WITH_PARENT,
                   GTK_MESSAGE_ERROR,
                   GTK_BUTTONS_CLOSE,
                   "输入格式不正确!\n请按下述格式输入:\n\n服务器名＠服务器IP " );
                   
	    return FAILURE;
    }
    
    /* 获取＠符号右侧的字符串 */
    gchar *subps = ( char * ) malloc ( sizeof( gchar ) * len + 1);
    strcpy( subps, right);
    
    /* 查找＠右侧的字符串里是否还有多余的＠ */    
    gchar *subpa = strstr( subps, "@");
    
    if(subpa)
    {
        showDialog(NULL,
                   GTK_DIALOG_DESTROY_WITH_PARENT,
                   GTK_MESSAGE_ERROR,
                   GTK_BUTTONS_CLOSE,
                   "输入格式不正确!\n请按下述格式输入:\n\n服务器名＠服务器IP " );
                   
	    return FAILURE;
    }
    
    /* 若没有，检测输入的IP是否有效 */
    else 
    {

    	if(ValidateIP(subps) == FAILURE)
    	   return FAILURE;

    }   
    
    /* 将用户输入的服务器名添加到列表中 */
    *pa = '\0';
    gchar *NewRow[] = {pserver, pa + 1, "未连接"};
    
    /* 分配一行的空间，添加空行到列表末尾 */
    gtk_list_store_append(liststore, &iter);
   
    /* 设置该行的内容 */
    for(i = 0; i< NUM_COLS ; i++)
    	gtk_list_store_set (liststore, 
			                &iter,
   			                i, 
                            NewRow[i],
  			                -1 );
    
    /* 设置服务器名输入文本框为空 */
    gtk_entry_set_text(GTK_ENTRY(entry_serveradd), "");

    return SUCCESS;
}

/* 函数功能：点击按钮“删除服务器“的动作
 * 入口参数：
 * 出口参数：无
 * 返 回 值 ：int
 *         SUCCESS  函数成功执行
 *         FAILURE  函数执行出错
 * 创建日期：2009年7月8号
 * 创 建 人 ：匡波 马小艳
 * 更新历史：暂无
 */
gint on_SeverDel_clicked(GtkWidget *widegt, gpointer data)
{
    GtkWidget *tree_view;
    GtkTreeModel *model;
    GtkTreeIter iter;
    GtkTreeSelection *select;
  
    /* 获取窗口的treeview 控件 */
    tree_view = glade_xml_get_widget (window1, "SvConnectTree");

    /* 获取用户要删除的行 */
    select = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree_view));
    
    /* 获取要删除行的指针，删除操作 */ 
    if (gtk_tree_selection_get_selected(select, &model, &iter))
    {
        gint res = 0;
        res = showDialog(NULL,
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_WARNING,
                         GTK_BUTTONS_OK_CANCEL,
                         "点击确定删除服务器!\n" );

        if ( res == GTK_RESPONSE_OK)
  	       gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
    }
    else
    {
        showDialog(NULL,
                   GTK_DIALOG_DESTROY_WITH_PARENT,
                   GTK_MESSAGE_ERROR,
                   GTK_BUTTONS_CLOSE,
                   "请选择要删除的服务器!\n" );
	    return FAILURE;
    } 
     
    return SUCCESS;
}

/* 函数功能：点击按钮“连接“的动作
 * 入口参数：
 * 出口参数：无
 * 返 回 值 ：int
 *         SUCCESS  函数成功执行
 *         FAILURE  函数执行出错
 * 创建日期：2009年7月8号
 * 创 建 人 ：匡波 马小艳
 * 更新历史：暂无
 */
gint on_SeverConnect_clicked(GtkWidget *widegt, gpointer data)
{   
   GtkWidget *tree_view = NULL;
   GtkTreeModel *model = NULL;
   GtkTreeIter iter;
   GtkTreeSelection *select = NULL;
   
   int argc = 0;
   char ** argv = NULL;

    /* 获取窗口的treeview 控件 */
   tree_view = glade_xml_get_widget (window1, "SvConnectTree");

    /* 获取用户要连接的行 */
   select = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree_view));
   if (select == NULL )
   {
   	   showDialog(NULL,
                      GTK_DIALOG_DESTROY_WITH_PARENT,
                      GTK_MESSAGE_ERROR,
                      GTK_BUTTONS_CLOSE,
                      "请选择要连接的服务器!" );       
	   return SUCCESS;
   }

   if (gtk_tree_selection_get_selected(select, &model, &iter))
   {
	   /* TODO 连接选中的服务器 */
   }
    
   else 
   {
       showDialog(NULL,
                  GTK_DIALOG_DESTROY_WITH_PARENT,
                  GTK_MESSAGE_ERROR,
                  GTK_BUTTONS_CLOSE,
                  "请选择服务器进行连接!" );
	   
	   return FAILURE;
   }
   
    /* 弹出服务器登录界面 */
   call(&windowlogin, argc, argv, "02 Sever_Login_Itrfc.glade", 0);
   

   return SUCCESS;
}

/* 函数功能：点击按钮“退出“的动作
 * 入口参数：
 * 出口参数：无
 * 返 回 值 ：int
 *         SUCCESS  函数成功执行
 *         FAILURE  函数执行出错
 * 创建日期：2009年7月8号
 * 创 建 人 ：匡波 马小艳
 * 更新历史：暂无
 */
gint on_SeverExit_clicked(GtkWidget *widegt, gpointer data)
{
    gint res = 0;
   
    res = showDialog(NULL,
                     GTK_DIALOG_DESTROY_WITH_PARENT,
                     GTK_MESSAGE_WARNING,
                     GTK_BUTTONS_OK_CANCEL,
                     "点击确定退出!\n" );

   if(res == GTK_RESPONSE_OK)
   {
        GtkWidget *win = NULL;
        
        win = glade_xml_get_widget(window1, "window1");
        gtk_widget_destroy( win );
  
        gtk_main_quit();
   } 

   return SUCCESS;
}

/* 函数功能：检测输入串是不是数字串
 * 入口参数：const char *pStr
 *         待检测的字符串
 * 出口参数：无
 * 返 回 值 ：gboolean
 *         TRUE  输入串是数字串
 *         FALSE 输入串不是数字串
 * 创建日期：2009年7月8号
 * 创 建 人 ：马小艳
 * 更新历史：暂无
 */
gboolean IsDigitStr(const char *pStr)
{ 
   int nLen = strlen(pStr);
   const char *p = pStr;
   int i;
          
   for(i = 0; i < nLen; i++)
   {
      if(!isdigit(p[i]))
         return FALSE;
   }
   return TRUE;
}

/* 函数功能：检测输入串是不是合法的IP地址
 * 入口参数：char *pIP
 *         待检测的字符串
 * 出口参数：无
 * 返 回 值 ：int
 *         SUCCESS  函数成功执行
 *         FAILURE  函数执行出错
 * 创建日期：2009年7月8号
 * 创 建 人 ：马小艳
 * 更新历史：暂无
 */
gint ValidateIP(char *pIP)
{
   char *szIP[5] = {NULL};
   char *pBuff = pIP;
   int i = 0;
 
   /* 检查输入串是不是被'.'分成了四段 */
   while ((szIP[i] = strtok(pBuff, ".")) != NULL )
   {
       i++;
       pBuff = NULL;

       if(i > 4)
       {
       	  showDialog(NULL,
                     GTK_DIALOG_DESTROY_WITH_PARENT,
                     GTK_MESSAGE_ERROR,
                     GTK_BUTTONS_CLOSE,
                     "IP地址不正确!\n请按下述格式重新输入:\n\n服务器名＠服务器IP ");
                   
	      return FAILURE;
       }
    }
    
       int nTmp;
  
       for(i = 0; i < 4; i++)
       {
       	   if(szIP[i] == NULL)
       	   {
       	      showDialog(NULL,
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_ERROR,
                         GTK_BUTTONS_CLOSE,
                         "IP地址不正确!\n请按下述格式重新输入:\n\n服务器名＠服务器IP " );
                   
	          return FAILURE;
           }
       	    /* 检测分成的四段是不是数字串 */ 
           if(!IsDigitStr((const char *)szIP[i]))
           {
       	      showDialog(NULL,
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_ERROR,
                         GTK_BUTTONS_CLOSE,
                         "IP地址不正确!\n请按下述格式重新输入:\n\n服务器名＠服务器IP " );
                   
	          return FAILURE;
           }
          
           nTmp = atoi((const char *)szIP[i]);
      
           /* 检测数字串所代表数字的大小是不是介于0和255之间 */
           if(nTmp > 256 || nTmp < 0)
           {
       	      showDialog(NULL,
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_ERROR,
                         GTK_BUTTONS_CLOSE,
                         "IP地址不正确!\n请按下述格式重新输入:\n\n服务器名＠服务器IP " );
                   
	          return FAILURE;
           }
       }
       
      return SUCCESS;
   }

/* 函数功能：主函数，连接glade界面和界面控件的相关动作
 * 入口参数：
 * 出口参数：无
 * 返 回 值 ：int
 *         SUCCESS  函数成功执行
 *         FAILURE  函数执行出错
 * 创建日期：2009年7月8号
 * 创 建 人 ：马小艳
 * 更新历史：暂无
 */
int main (int argc, char **argv)
{
   Gargc = argc;
   Gargv = argv;
   gtk_init(&argc, &argv);
   
   /* 连接glade图形 */
   window1 = glade_xml_new("01 Sever_Connect_Itrfc.glade", NULL, NULL);
   glade_xml_signal_autoconnect(window1);

   /* 设置窗口listview控件 */
   treeView(window1, "SvConnectTree", SERVER_LIST);

#ifdef DEBUG
   printf("window %x ", window1);
#endif

   gtk_main();
  
   return SUCCESS;
}

